/*
 * 责任链模式是很实用的一种实际方法。举个例子来说，我们平常在公司里面难免不了报销流程。
 *
 * 但是，我们知道公司里面每一级的领导的报批额度是不一样的。
 *
 * 比如说，科长的额度是1000元，部长是10000元，总经理是10万元。那么这个时候，我们应该怎么设计呢？
 *
 * 其实可以这么理解。
 *
 * 比如说，有人来找领导报销费用了，那么领导可以自己先看看自己能不能报。
 * 
 * 如果费用可以顺利报下来当然最好，可是万一报不下来呢？那就只能请示领导的领导了。
 */

typedef struct leader
{
	struct leader * next;
	int account;

	int (*request)(struct leader * pleader, int num);
}leader;

/*
 * 所以这个时候，我们首先需要设置额度和领导。
 */

void set_account(struct leader * pleader, int account)
{
	assert(NULL != pleader);

	pleader->account = account;
}

void set_next_leader(const struct leader * pleader, struct leader * next)
{
	assert(NULL != pleader && NULL != next);

	pleader->next = next;
}

/*
 * 此时，如果有一个员工过来报销费用，那么应该怎么做呢？
 *
 * 假设此时的Leader是经理，报销额度是10万元。所以此时，我们可以看看报销的费用是不是小于10万元？
 *
 * 少于这个数就OK，反之就得上报自己的领导了。 
 */
int request_for_manager(struct leader * pleader, int num)
{
	assert(NULL != pleader && 0 != num);

	if (num < 100000)
		return 1;
	else if (pleader->next)
		return pleader->next->request(pleader->next, num);
	else
		return 0;
}
